🎖️GitЯра🎖️
Commit 0b81257b504fc39e65d27d7ff3aab6fdf7b6daf1
Parents : 23c6d24
Author : James Rich <2199651+jamesarich@users.noreply.github.com>
Signature : Signature validation error
Date : 2026-06-28T09:37:46-05:00
Committer : GitHub <noreply@github.com>
Date : 2026-06-28T14:37:46Z
refactor(settings): replace SimpleDateFormat with kotlinx-datetime (#5992)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Changes
2 files changed, 36 insertions(+), 11 deletions(-)
Diff
diff --git a/feature/settings/src/androidMain/kotlin/org/meshtastic/feature/settings/SettingsScreen.kt b/feature/settings/src/androidMain/kotlin/org/meshtastic/feature/settings/SettingsScreen.kt
index d4d93410b8..6b319a6387 100644
--- a/feature/settings/src/androidMain/kotlin/org/meshtastic/feature/settings/SettingsScreen.kt
+++ b/feature/settings/src/androidMain/kotlin/org/meshtastic/feature/settings/SettingsScreen.kt
@@ -36,12 +36,14 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.eygraber.uri.toKmpUri
+import kotlinx.datetime.LocalDateTime
+import kotlinx.datetime.TimeZone
+import kotlinx.datetime.format
+import kotlinx.datetime.toLocalDateTime
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.koinInject
import org.koin.core.qualifier.named
import org.meshtastic.core.common.util.nowMillis
-import org.meshtastic.core.common.util.toDate
-import org.meshtastic.core.common.util.toInstant
import org.meshtastic.core.navigation.DiscoveryRoute
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.navigation.SettingsRoute
@@ -85,8 +87,7 @@ import org.meshtastic.feature.settings.radio.component.EditDeviceProfileDialog
import org.meshtastic.feature.settings.util.LanguageUtils
import org.meshtastic.feature.settings.util.LanguageUtils.languageMap
import org.meshtastic.proto.DeviceProfile
-import java.text.SimpleDateFormat
-import java.util.Locale
+import kotlin.time.Instant.Companion.fromEpochMilliseconds
@Suppress("LongMethod", "CyclomaticComplexMethod")
@Composable
@@ -142,8 +143,16 @@ fun SettingsScreen(
} else {
deviceProfile = it
val nodeName = (it.short_name ?: "").ifBlank { "node" }
- val dateFormat = SimpleDateFormat("yyyyMMdd", Locale.getDefault())
- val dateStr = dateFormat.format(nowMillis.toInstant().toDate())
+ val dateStr =
+ fromEpochMilliseconds(nowMillis)
+ .toLocalDateTime(TimeZone.currentSystemDefault())
+ .format(
+ LocalDateTime.Format {
+ year()
+ monthNumber()
+ day()
+ },
+ )
val fileName = "Meshtastic_${nodeName}_${dateStr}_nodeConfig.cfg"
val intent =
Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
diff --git a/feature/settings/src/androidMain/kotlin/org/meshtastic/feature/settings/component/PersistenceSection.kt b/feature/settings/src/androidMain/kotlin/org/meshtastic/feature/settings/component/PersistenceSection.kt
index 2c72a745e4..128befc1dd 100644
--- a/feature/settings/src/androidMain/kotlin/org/meshtastic/feature/settings/component/PersistenceSection.kt
+++ b/feature/settings/src/androidMain/kotlin/org/meshtastic/feature/settings/component/PersistenceSection.kt
@@ -23,10 +23,13 @@ import androidx.appcompat.app.AppCompatActivity.RESULT_OK
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.tooling.preview.Preview
+import kotlinx.datetime.LocalDateTime
+import kotlinx.datetime.TimeZone
+import kotlinx.datetime.format
+import kotlinx.datetime.format.char
+import kotlinx.datetime.toLocalDateTime
import org.jetbrains.compose.resources.stringResource
import org.meshtastic.core.common.util.nowMillis
-import org.meshtastic.core.common.util.toDate
-import org.meshtastic.core.common.util.toInstant
import org.meshtastic.core.database.DatabaseConstants
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.app_settings
@@ -39,8 +42,18 @@ import org.meshtastic.core.ui.component.ListItem
import org.meshtastic.core.ui.icon.MeshtasticIcons
import org.meshtastic.core.ui.icon.Output
import org.meshtastic.core.ui.theme.AppTheme
-import java.text.SimpleDateFormat
-import java.util.Locale
+import kotlin.time.Instant.Companion.fromEpochMilliseconds
+
+private val EXPORT_TIMESTAMP_FORMAT =
+ LocalDateTime.Format {
+ year()
+ monthNumber()
+ day()
+ char('_')
+ hour()
+ minute()
+ second()
+ }
/** Section for settings related to data persistence and exports. */
@Composable
@@ -50,7 +63,10 @@ fun PersistenceSection(
nodeShortName: String,
onExportData: (android.net.Uri) -> Unit,
) {
- val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(nowMillis.toInstant().toDate())
+ val timestamp =
+ fromEpochMilliseconds(nowMillis)
+ .toLocalDateTime(TimeZone.currentSystemDefault())
+ .format(EXPORT_TIMESTAMP_FORMAT)
val exportRangeTestLauncher =
rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) {
Served by rngit 1.5.2 - Generated in 0.17s